﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace CSharpTaskBaseApp
{
    /// <summary>
    /// 
    /// Thread：我们可以开启一个线程、暂停、继续、终止
    /// 但是请大家记住：线程开启会在空间和时间上有不小的开销。所以，不能随便开
    /// 
    /// 
    /// ThreadPool：会根据你的CPU的核心数开启一个最合适的线程数量。如果你操作中，非常耗时，就不要用线程池
    /// 
    /// 
    /// Task
    /// Task=>Thread和ThreadPool结合
    /// 
    /// Task三种启动方式
    /// Task对象的Start方法
    /// Task类的静态方法Run
    /// .Factory.StartNew方法
    /// 
    /// CancellationTokenSource取消任务和重启
    /// 
    /// </summary>
    internal class Program
    {
        static void Main(string[] args)
        {
            Test1();
            Console.WriteLine("-----------------------");

            Test2();
            Console.WriteLine("-----------------------");

            Test3();

            Console.ReadLine();
        }

        //【1】创建Task对象，然后调用Start方法启动线程
        static void Test1()
        {
            Task task = new Task(() =>
            {
                //在这个地方编写我们需要的逻辑...

                Console.WriteLine("new一个新的Task，对应的子线程ID=" +Thread.CurrentThread.ManagedThreadId);
            });
            task.Start();
        }

        //【2】使用Task的静态方法Run方法直接启动线程
        static void Test2()
        {
            Task task = Task.Run(() =>
            {
                //在这个地方编写我们需要的逻辑...

                Console.WriteLine("new一个新的Task，对应的子线程ID=" + Thread.CurrentThread.ManagedThreadId);
            });
        }

        // 使用TaskFactory启动
        static void Test3()
        {
            Task task = Task.Factory.StartNew(() =>
            {
                //在这个地方编写我们需要的逻辑...

                Console.WriteLine("new一个新的Task，对应的子线程ID=" + Thread.CurrentThread.ManagedThreadId);
            });
        }
    }
}
